<template>
  <el-card shadow="always" :body-style="{ padding: '20px' }">
    <!-- 标题 -->
    <div slot="header">基本资料</div>
    <!-- 内容 -->
    <ElTs />
    <el-ts></el-ts>
    <!-- 表单 -->
    <el-form
      :model="userInfo"
      :rules="userFormRules"
      ref="fm"
      label-width="100px"
    >
      <el-form-item label="登录名称">
        <el-input v-model="userInfo.username" disabled></el-input>
      </el-form-item>
      <el-form-item label="用户昵称" prop="nickname">
        <el-input
          v-model="userInfo.nickname"
          minlength="1"
          maxlength="10"
        ></el-input>
      </el-form-item>
      <el-form-item label="用户邮箱" prop="email">
        <el-input v-model="userInfo.email"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button @click="updateUser" type="primary">提交修改</el-button>
        <el-button @click="reset">重置</el-button>
      </el-form-item>
    </el-form>
  </el-card>
</template>

<script>
import { updateUserInfoApi } from '@/api/user'
export default {
  data () {
    return {
      // 表单数据
      // userInfo: {
      //   // 用户名不能改
      //   username: '',
      //   // 昵称
      //   nickname: '',
      //   // 邮箱
      //   email: ''
      // },
      // 用户信息修改：在原有用户信息数据基础上
      // 思考1🤔：为什么刷新之后之前存在vuex的数据获取不到了？
      // 因为：用户数据获取=》发请求获取的，异步的，组件赋值是vuex默认值
      // userInfo: this.$store.state.user.userInfo,
      // 思考2🤔：监控数据的变化，干事儿=》使用watch监听vuex数据的变化
      userInfo: {},
      // 校验规则
      userFormRules: {
        nickname: [
          { required: true, message: '请输入用户昵称', trigger: 'blur' },
          { pattern: /^\S{2,10}$/, message: '昵称必须是2-10位的非空字符串', trigger: 'blur' }
        ],
        email: [
          { required: true, message: '请输入用户邮箱', trigger: 'blur' },
          //  type: 'email' 指校验邮箱格式
          { type: 'email', message: '邮箱格式不正确', trigger: 'blur' }
        ]
      }
    }
  },
  watch: {
    // 同步vuex数据给组件变量userInfo使用
    // 说明：刷新问题解决了，但是切页面不行
    // '$store.state.user.userInfo' (newValue) {
    //   console.log('监听vuex的userInfo变量变化：', newValue)
    //   this.userInfo = newValue
    // }
    // 刷新和切换页面都没问题
    '$store.state.user.userInfo': {
      immediate: true, // 页面加载之后立马执行一次监听
      handler (newValue) {
        console.log('监听vuex的userInfo变量变化：', newValue)
        // newValue和vuex中变量是有引用关系=》需要拷贝赋值
        this.userInfo = { ...newValue }
      }
    }
  },
  created () {
    this.$haohao()
  },
  methods: {
    // 修改用户信息
    updateUser () {
      /**
       * 修改流程：
       * 1. 兜底校验
       * 2. 校验通过后，发送请求修改
       * 3. 因为vuex存的还是没修改之前的=》需要更新
       */
      this.$refs.fm.validate(async (isOk) => {
        if (isOk) {
          // 校验通过
          // this.userInfo 把要修改的最新用户信息传给后台
          await updateUserInfoApi(this.userInfo)
          this.$message.success('修改成功')
          // 因为vuex存的还是没修改之前的=》需要更新
          this.$store.dispatch('user/getUserAction')
        }
      })
    },
    // 重置表单数据
    reset () {
      this.$refs.fm.resetFields()
    }
  }
}
</script>

<style lang="less" scoped>
</style>
